package com.edu.exam.entity.grading.audit;

import com.edu.exam.enums.GradeAuditOperationLevel;
import com.edu.exam.enums.GradeAuditOperationResult;
import com.edu.exam.enums.GradeAuditOperationSource;
import com.edu.exam.enums.GradeAuditOperationType;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 成绩审核记录实体类
 *
 * <p>成绩审核记录实体用于记录审核过程中的所有操作历史，包含
 * 操作日志、状态变更、处理结果、操作轨迹等。确保审核过程的完整审计追踪。</p>
 *
 * <p>所属模块：B-06 成绩管理模块</p>
 * <p>对应数据库表：grade_audit_record</p>
 *
 * <p>核心功能：
 * - 操作记录：记录所有审核相关的操作行为
 * - 状态追踪：追踪审核任务的状态变化
 * - 结果记录：记录操作的处理结果和详细信息
 * - 审计轨迹：提供完整的操作审计轨迹
 * - 异常处理：记录异常情况和处理过程</p>
 *
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class GradeAuditRecord {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 审核任务ID
     *
     * <p>关联的审核任务ID。</p>
     */
    @Column(name = "audit_task_id", nullable = false)
    private Long auditTaskId;

    /**
     * 批次ID
     *
     * <p>操作的批次标识符。</p>
     */
    @Column(name = "batch_id", length = 100)
    private String batchId;

    /**
     * 操作类型
     *
     * <p>记录的操作类型。
     * 支持的类型：CREATE（创建）、ASSIGN（分配）、START（开始）、REVIEW（审核）、APPROVE（通过）、REJECT（拒绝）、COMPLETE（完成）、CANCEL（取消）、REASSIGN（重新分配）、COMMENT（备注）、ATTACHMENT（附件）、EXPORT（导出）、VIEW（查看）、MODIFY（修改）、DELETE（删除）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "operation_type", nullable = false, length = 20)
    private GradeAuditOperationType operationType;

    /**
     * 操作时间
     *
     * <p>操作发生的时间。</p>
     */
    @Column(name = "operation_time", nullable = false)
    private LocalDateTime operationTime;

    /**
     * 操作员ID
     *
     * <p>执行操作的用户ID。</p>
     */
    @Column(name = "operator_id", nullable = false, length = 50)
    private String operatorId;

    /**
     * 操作员姓名
     *
     * <p>执行操作的用户姓名。</p>
     */
    @Column(name = "operator_name", nullable = false, length = 100)
    private String operatorName;

    /**
     * 操作员角色
     *
     * <p>执行操作时用户的角色。</p>
     */
    @Column(name = "operator_role", length = 50)
    private String operatorRole;

    /**
     * 操作内容
     *
     * <p>操作的详细内容描述。</p>
     */
    @Column(name = "operation_content", columnDefinition = "TEXT")
    private String operationContent;

    /**
     * 操作结果
     *
     * <p>操作的执行结果。
     * 支持的结果：SUCCESS（成功）、FAILED（失败）、PARTIAL（部分成功）、SKIPPED（跳过）、TIMEOUT（超时）、ERROR（错误）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "operation_result", length = 20)
    private GradeAuditOperationResult operationResult = GradeAuditOperationResult.SUCCESS;

    /**
     * 结果详情
     *
     * <p>操作结果的详细信息，JSON格式存储。</p>
     */
    @Column(name = "result_details", columnDefinition = "TEXT")
    private String resultDetails;

    /**
     * 变更前状态
     *
     * <p>操作前的任务状态。</p>
     */
    @Column(name = "before_status", length = 20)
    private String beforeStatus;

    /**
     * 变更后状态
     *
     * <p>操作后的任务状态。</p>
     */
    @Column(name = "after_status", length = 20)
    private String afterStatus;

    /**
     * 变更数据
     *
     * <p>操作前后的数据变更，JSON格式存储。</p>
     */
    @Column(name = "changed_data", columnDefinition = "TEXT")
    private String changedData;

    /**
     * IP地址
     *
     * <p>操作发起的IP地址。</p>
     */
    @Column(name = "ip_address", length = 50)
    private String ipAddress;

    /**
     * 用户代理
     *
     * <p>操作发起的客户端信息。</p>
     */
    @Column(name = "user_agent", length = 500)
    private String userAgent;

    /**
     * 会话ID
     *
     * <p>操作所属的会话ID。</p>
     */
    @Column(name = "session_id", length = 100)
    private String sessionId;

    /**
     * 工作流节点ID
     *
     * <p>操作时所在的工作流节点ID。</p>
     */
    @Column(name = "workflow_node_id", length = 50)
    private String workflowNodeId;

    /**
     * 工作流节点名称
     *
     * <p>操作时所在的工作流节点名称。</p>
     */
    @Column(name = "workflow_node_name", length = 200)
    private String workflowNodeName;

    /**
     * 处理耗时
     *
     * <p>操作处理的耗时（毫秒）。</p>
     */
    @Column(name = "processing_duration_ms")
    private Long processingDurationMs;

    /**
     * 错误信息
     *
     * <p>操作失败时的错误信息。</p>
     */
    @Column(name = "error_message", columnDefinition = "TEXT")
    private String errorMessage;

    /**
     * 异常堆栈
     *
     * <p>操作失败时的异常堆栈信息。</p>
     */
    @Column(name = "exception_stack", columnDefinition = "LONGTEXT")
    private String exceptionStack;

    /**
     * 操作来源
     *
     * <p>操作的来源系统。
     * 支持的来源：WEB（网页端）、API（接口）、BATCH（批量处理）、SYSTEM（系统自动）、MOBILE（移动端）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "operation_source", length = 20)
    private GradeAuditOperationSource operationSource = GradeAuditOperationSource.WEB;

    /**
     * 操作级别
     *
     * <p>操作的重要级别。
     * 支持的级别：INFO（信息）、WARNING（警告）、ERROR（错误）、CRITICAL（严重）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "operation_level", length = 10)
    private GradeAuditOperationLevel operationLevel = GradeAuditOperationLevel.INFO;

    /**
     * 是否关键操作
     *
     * <p>是否为关键业务操作。</p>
     */
    @Column(name = "is_critical", nullable = false)
    private Boolean isCritical = false;

    /**
     * 是否自动操作
     *
     * <p>是否为系统自动执行的操作。</p>
     */
    @Column(name = "is_automatic", nullable = false)
    private Boolean isAutomatic = false;

    /**
     * 父记录ID
     *
     * <p>父级记录的ID，用于操作链追踪。</p>
     */
    @Column(name = "parent_record_id")
    private Long parentRecordId;

    /**
     * 操作序列号
     *
     * <p>在同一批次中的操作序列号。</p>
     */
    @Column(name = "sequence_number")
    private Integer sequenceNumber;

    /**
     * 审核意见
     *
     * <p>审核相关的意见或评论。</p>
     */
    @Column(name = "audit_comment", columnDefinition = "TEXT")
    private String auditComment;

    /**
     * 审核评分
     *
     * <p>审核的评分（如果适用）。</p>
     */
    @Column(name = "audit_score")
    private Integer auditScore;

    /**
     * 附件信息
     *
     * <p>操作相关的附件信息，JSON格式存储。</p>
     */
    @Column(name = "attachment_info", columnDefinition = "TEXT")
    private String attachmentInfo;

    /**
     * 扩展属性
     *
     * <p>JSON格式的扩展属性。</p>
     */
    @Column(name = "extended_properties", columnDefinition = "TEXT")
    private String extendedProperties;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;



}